/*
6）	对于创建一个子类对象时（继承关系），他们的静态代码块，静态属性初始化，普通代码块，普通属性初始化，构造方法的调用顺序
 */
public class Main {
    public static void main(String[] args) {
        new B();
    }
}
class A {
    static int a = print1();
    int b = print2() ;
    public static int  print1(){
        System.out.println("父类静态方法");//1
        return 1;
    }
    public  int  print2(){
        System.out.println("父类普通方法");//5
        return 2;
    }
    static{
        System.out.println("父类静态代码块被调用");//2
    }

    {
        System.out.println("父类普通代码块被调用");//6
    }
    public A(){
        System.out.println("父类构造器被调用");//7
    }
}
class B extends A {
    static int c = print3();
    int d = print4();
    public static int  print3(){
        System.out.println("子类静态方法被调用");//3
        return 3;
    }
    public  int  print4(){
        System.out.println("子类普通方法被调用");//8
        return 4;
    }
    static{
        System.out.println("子类静态代码块");//4
    }
    {
        System.out.println("子类普通代码块");//9
    }
    public B(){
        System.out.println("子类构造器被调用");//10
    }
}
//总结：
//1。父类的静态代码块和静态属性（优先级一样，按定义顺序执行）
//2.子类的静态代码块和静态属性（优先级一样，按定义顺序执行）
//3.父类的普通代码块和普通属性初始化（优先级一样，按定义顺序执行）
//4.父类的构造方法
//5.子类的普通代码和普通属性初始化（优先级一样，按定义顺序执行）
//6.子类的构造方法
